package com.vic.priorityqueue.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 优先级队列配置
 */
@Configuration
public class PriorityConfig {

    // 交换机
    public static final String PRIORITY_EXCHANGE = "priority_exchange";
    // 优先级队列
    public static final String PRIORITY_QUEUE = "priority_queue";
    // 路由键
    public static final String PRIORITY_ROUTING_KEY = "priority";

    // 声明交换机
    @Bean("priority_exchange")
    public DirectExchange priorityExchange() {
        return ExchangeBuilder.directExchange(PRIORITY_EXCHANGE).durable(true).build();
    }

    // 声明队列
    @Bean("priority_queue")
    public Queue logQueue() {
        /**
         * maxPriority(int maxPriority): 设置队列支持的最大优先级数量，如果没有设置，则队列将不支持消息优先级。
         * 官方支持的优先级范围是 0 ~ 255，超过 255 就会发生报错，但是一般企业使用的优先级是 0 ~ 10，如果 maxPriority 设置
         * 的太大，会浪费 cpu 和 内存，因为消息是要在队列中排队的，队列长度太大，排序的过程中会损耗性能。
         */
        return QueueBuilder.durable(PRIORITY_QUEUE).maxPriority(10).build();
    }

    // 绑定
    @Bean
    public Binding priorityQueueBindingPriorityExchange(@Qualifier("priority_queue") Queue queue, @Qualifier("priority_exchange") DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(PRIORITY_ROUTING_KEY);
    }

}